package com.lkd.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.lkd.dto.RegionAllPageDto;
import com.lkd.entity.Business;
import com.lkd.entity.Node;
import com.lkd.entity.Region;
import com.lkd.exception.BusinessException;
import com.lkd.mapper.BusinessMapper;
import com.lkd.mapper.NodeMapper;
import com.lkd.mapper.RegionMapper;
import com.lkd.mapper.VmTypeMapper;
import com.lkd.result.PageBean;
import com.lkd.service.NodeService;
import com.lkd.vo.NodeVo;
import com.lkd.vo.RegionAllPageVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class NodeServiceImpl implements NodeService {
    //使用@Autowired注解，自动注入NodeMapper
    @Autowired
    private NodeMapper nodeMapper;

    @Autowired
    private RegionMapper regionMapper;

    @Autowired
    private BusinessMapper businessMapper;

    @Autowired
    private VmTypeMapper vmTypeMapper;
//    @Override
//    //根据区域id查询该区域下的点位列表
@Override
public PageBean listByRid(RegionAllPageDto dto) {
    PageHelper.startPage(dto.getPageIndex(),dto.getPageSize());
    List<RegionAllPageVo> list = nodeMapper.listByRid(dto);

    list.forEach(this::enrichRegionAllPageVO);

    Page<RegionAllPageVo> page = (Page<RegionAllPageVo>) list;
    return new PageBean(page.getPageNum(),page.getPageSize(), (long) page.getPages(),page.getTotal(),page.getResult());
}
//    public PageBean listByRid(RegionAllPageDto dto) {
//        PageHelper.startPage(dto.getPageIndex(),dto.getPageSize());
//        List<RegionAllPageVo> list = nodeMapper.listByRid(dto);
//        RegionAllPageVo regionAllPageVo = new RegionAllPageVo();
//        Integer vmCount = regionMapper.getCountByRegionId(regionAllPageVo.getId());
//        regionAllPageVo.setVmCount(vmCount.toString());
//
//        Region region = regionMapper.getByRid(regionAllPageVo.getRegionId());
//        regionAllPageVo.setRegion(region);
//
//        Business business = businessMapper.getById(regionAllPageVo.getBusinessId());
//        regionAllPageVo.setBusinessType(business);
//        Page<RegionAllPageVo> page = (Page<RegionAllPageVo>) list;
//        return new PageBean(page.getPageNum(),page.getPageSize(), (long) page.getPages(),page.getTotal(),page.getResult());
//    }

    @Override
    //新增点位
    public Boolean save(Node node) {
        Boolean result = nodeMapper.save(node);
        return result;
    }

//    @Override
//    //根据点位id查询该点位下的设备列表
//    public List<NodeVo> getVmList(Long nodeId) {
//        List<NodeVo> lists = nodeMapper.getVmList(nodeId);
//
//        lists.forEach(list ->{
//            // 根据NodeVO类型获取NodeVO详细信息，并设置到NodeVO对象中
//            list.setType(vmTypeMapper.getByVmType(list.getVmType()));
//
//            // 创建一个区域查询对象，并设置区域ID
//            RegionAllPageDto dto = new RegionAllPageDto();
//            dto.setRegionId(list.getRegionId());
//
//            // 根据区域ID查询区域详细信息，并获取第一个结果
//            List<RegionAllPageVo> regionAllPageVOS = nodeMapper.listByRid(dto);
//            RegionAllPageVo regionAllPageVo = regionAllPageVOS.get(0);
//
////            // 丰富区域信息对象，可能包括额外的数据加载或处理
////            RegionAllPageVo regionAllPageVo = new RegionAllPageVo();
////            Integer vmCount = regionMapper.getCountByRegionId(regionAllPageVo.getId());
////            regionAllPageVo.setVmCount(vmCount.toString());
////
////            Region region = regionMapper.getByRid(regionAllPageVo.getRegionId());
////            regionAllPageVo.setRegion(region);
//
//            // 丰富区域信息对象，可能包括额外的数据加载或处理
//            enrichRegionAllPageVO(regionAllPageVo);
//            // 将丰富的区域信息设置到NodeVO中
//            list.setNode(regionAllPageVo);
//
//            // 根据区域ID获取区域详细信息，并设置到NodeVO中
//            list.setRegion(regionMapper.getByRid(Integer.parseInt(list.getRegionId())));
//
//        });
//
//
//
//        // 返回包含NodeVO
//        return lists;
//    }
    // 根据点位id查询设备列表
    @Override
    public List<NodeVo> getVmList(Long nodeId) {
        // 从数据库中获取指定节点的NodeVO列表
        List<NodeVo> lists = nodeMapper.getVmList(nodeId);

        lists.forEach(list ->{
            // 根据NodeVO类型获取NodeVO详细信息，并设置到NodeVO对象中
            list.setType(vmTypeMapper.getByVmType(list.getVmType()));

            // 创建一个区域查询对象，并设置区域ID
            RegionAllPageDto dto = new RegionAllPageDto();
            dto.setRegionId(list.getRegionId());

            // 根据区域ID查询区域详细信息，并获取第一个结果
            List<RegionAllPageVo> regionAllPageVOS = nodeMapper.listByRid(dto);
            RegionAllPageVo regionAllPageVO = regionAllPageVOS.get(0);

            // 丰富区域信息对象，可能包括额外的数据加载或处理
            enrichRegionAllPageVO(regionAllPageVO);

            // 将丰富的区域信息设置到NodeVO中
            list.setNode(regionAllPageVO);

            // 根据区域ID获取区域详细信息，并设置到NodeVO中
            list.setRegion(regionMapper.getByRid(Integer.parseInt(list.getRegionId())));

        });

        // 返回包含NodeVO
        return lists;
    }

    //修改点位
    @Override
    public Boolean update(Node node) {
        Boolean result = nodeMapper.update(node);
        return result;
    }

    //删除点位
    @Override
    @Transactional
    public Boolean deleteById(Long nodeId) {
        Boolean result = false;
        //如果该点位下有设备 就不允许删除
        int count = nodeMapper.getVmCountByNodeId(nodeId);
        if (count<0){
            result = false;
            throw new BusinessException("该点位下有设备，不允许删除");
        }
        result = nodeMapper.deleteById(nodeId);
        return result;
    }

    // 统计点位总数
    @Override
    public Integer count() {
        Integer count = nodeMapper.count();
        if (count==null || count==0){
            return 0;
        }
        return count;
    }


    private void enrichRegionAllPageVO(RegionAllPageVo regionAllPageVo) {
        Integer vmCount = regionMapper.getCountByRegionId(regionAllPageVo.getId());
        regionAllPageVo.setVmCount(vmCount.toString());

        Region region = regionMapper.getByRid(regionAllPageVo.getRegionId());
        regionAllPageVo.setRegion(region);

        Business business = businessMapper.getById(regionAllPageVo.getBusinessId());
        regionAllPageVo.setBusinessType(business);
    }


}
